/**
 * 项目申请模型
 * 存储项目申请数据
 */

const BaseModel = require('../../../framework/database/model.js');

class ProjectApplyModel extends BaseModel {
    constructor() {
        super();
        
        // 设置集合名
        this.setCollection('project_apply');
        
        // 字段定义
        this.DB_STRUCTURE = {
            _id: 'string|true',
            
            // 申请基本信息
            APPLY_TYPE: 'int|true|comment=申请类型',
            APPLY_TYPE_NAME: 'string|true|comment=申请类型名称',
            APPLY_STATUS: 'int|true|comment=申请状态',
            APPLY_STATUS_NAME: 'string|true|comment=申请状态名称',
            APPLY_ACTIVE_STATUS: 'int|true|comment=活动状态',
            APPLY_ACTIVE_STATUS_NAME: 'string|true|comment=活动状态名称',
            APPLY_TIME: 'int|true|comment=申请时间',
            APPLY_UPDATE_TIME: 'int|true|comment=更新时间',
            
            // 申请人信息
            APPLICANT_ID: 'string|true|comment=申请人ID',
            APPLICANT_NAME: 'string|true|comment=申请人姓名',
            projectLeadId: 'string|false',    // 项目负责人ID
            projectLead: 'string|false',      // 项目负责人姓名
            teamMembers: 'array|true|default=[]', // 团队成员列表
            
            // 项目基本信息
            model: 'string|true|comment=型号',
            PROJECT_TITLE: 'string|true|comment=项目名称',
            customerName: 'string|true|comment=客户名称',
            PROJECT_CUSTOMER_NAME: 'string|true|comment=客户名称',
            applicationType: 'string|true|comment=方案类型',
            startDate: 'int|true|comment=开始日期',
            deadline: 'int|true|comment=截止日期',
            priority: 'string|true|comment=优先级',
            description: 'string|false|comment=项目描述',
            PROJECT_DESC: 'string|false|comment=项目描述',
            
            // 项目参数
            workTemp: 'string|false|comment=工作环境温度',
            certification: 'string|false|comment=认证要求',
            lowPower: 'string|false|comment=低功耗要求',
            startupTime: 'string|false|comment=启动时间要求',
            conformalCoating: 'string|false|comment=三防漆要求',
            ratedVoltage: 'string|false|comment=额定电压',
            maxPower: 'string|false|comment=最大功率',
            maxSpeed: 'string|false|comment=最高转速',
            polePairs: 'string|false|comment=极对数',
            hasHall: 'string|false|comment=霍尔传感器',
            hasFG: 'string|false|comment=频率发生器',
            controlMode: 'string|false|comment=控制模式',
            controlAlgorithm: 'string|false|comment=控制算法',
            rotation: 'string|false|comment=旋转方向',
            hasBrake: 'string|false|comment=刹车功能',
            
            // 保护参数
            stallProtection: 'string|false|comment=堵转保护',
            overvoltageProtection: 'string|false|comment=过压保护',
            undervoltageProtection: 'string|false|comment=欠压保护',
            temperatureProtection: 'string|false|comment=温度保护',
            overcurrentProtection: 'string|false|comment=过流保护',
            currentLimitProtection: 'string|false|comment=限流保护',
            blockageProtection: 'string|false|comment=堵孔/空转保护',
            phaseProtection: 'string|false|comment=缺相保护',
            
            // 吸尘器特有参数
            suctionPower: 'string|false|comment=吸力',
            airVolume: 'string|false|comment=风量',
            dustCapacity: 'string|false|comment=尘桶容量',
            filterType: 'string|false|comment=过滤系统',
            noiseLevel: 'string|false|comment=噪音级别',
            
            // 风机特有参数
            airFlow: 'string|false|comment=风量',
            staticPressure: 'string|false|comment=静压',
            fanType: 'string|false|comment=风扇类型',
            bladeMaterial: 'string|false|comment=扇叶材质',
            controlInterface: 'string|false|comment=控制接口类型',
            speedControl: 'string|false|comment=调速方式',
            
            // 水泵特有参数
            waterproofLevel: 'string|false|comment=防水等级',
            flowRate: 'string|false|comment=流量',
            maxHead: 'string|false|comment=最大扬程',
            pumpType: 'string|false|comment=泵类型',
            impellerType: 'string|false|comment=叶轮类型',
            inlet: 'string|false|comment=进水口规格',
            outlet: 'string|false|comment=出水口规格',
            dryRunningProtection: 'string|false|comment=干运行保护',
            overflowProtection: 'string|false|comment=溢水保护',
            
            // 自定义参数
            customParams: 'object|false|comment=自定义参数',
            
            // 样品信息
            hasSample: 'string|false|comment=是否有样机',
            sampleCount: 'string|false|comment=样品数量',
            sampleImages: 'array|false|comment=样品图片',
            
            // 附件信息
            attachments: 'array|false|comment=附件列表',
            
            // 文件信息
            files: 'object|false|comment=文件信息',
            
            // 休眠相关
            IS_SLEEP: 'int|false|default=0|comment=是否休眠：0=否, 1=是',
            SLEEP_REASON: 'string|false|comment=休眠原因',
            SLEEP_TIME: 'int|false|comment=休眠时间',
            WAKEUP_REASON: 'string|false|comment=唤醒原因',
            WAKEUP_TIME: 'int|false|comment=唤醒时间',
            
            // 取消相关
            CANCEL_REASON: 'string|false|comment=取消原因',
            
            // 完成相关
            COMPLETE_TIME: 'int|false|comment=完成时间'
        };
    }
    
    /**
     * 按条件获取项目申请列表
     * @param {Object} where 查询条件
     * @param {Object} options 选项
     * @returns {Promise<Array>} 申请列表
     */
    async getApplyList(where, options = {}) {
        const orderBy = options.orderBy || { APPLY_UPDATE_TIME: -1 };
        const page = options.page || 1;
        const size = options.size || 10;
        const fields = options.fields || '*';
        
        return await this.getList(where, page, size, orderBy, fields);
    }
    
    /**
     * 获取指定申请人的项目申请列表
     * @param {String} applicantId 申请人ID
     * @param {Object} options 选项
     * @returns {Promise<Array>} 申请列表
     */
    async getApplyListByApplicant(applicantId, options = {}) {
        const where = { APPLICANT_ID: applicantId };
        
        if (options.status) {
            where.APPLY_STATUS = options.status;
        }
        
        return await this.getApplyList(where, options);
    }
    
    /**
     * 获取指定状态的项目申请列表
     * @param {Number} status 状态
     * @param {Object} options 选项
     * @returns {Promise<Array>} 申请列表
     */
    async getApplyListByStatus(status, options = {}) {
        const where = { APPLY_STATUS: status };
        return await this.getApplyList(where, options);
    }
    
    /**
     * 获取指定活动状态的项目申请列表
     * @param {Number} activeStatus 活动状态
     * @param {Object} options 选项
     * @returns {Promise<Array>} 申请列表
     */
    async getApplyListByActiveStatus(activeStatus, options = {}) {
        const where = { APPLY_ACTIVE_STATUS: activeStatus };
        return await this.getApplyList(where, options);
    }
    
    /**
     * 获取指定方案类型的项目申请列表
     * @param {String} applicationType 方案类型
     * @param {Object} options 选项
     * @returns {Promise<Array>} 申请列表
     */
    async getApplyListByType(applicationType, options = {}) {
        const where = { applicationType };
        return await this.getApplyList(where, options);
    }
    
    /**
     * 搜索项目申请
     * @param {String} keyword 关键词
     * @param {Object} options 选项
     * @returns {Promise<Array>} 申请列表
     */
    async searchApply(keyword, options = {}) {
        const regex = new RegExp(keyword, 'i');
        const where = {
            $or: [
                { model: regex },
                { PROJECT_TITLE: regex },
                { customerName: regex },
                { PROJECT_CUSTOMER_NAME: regex },
                { APPLICANT_NAME: regex },
                { description: regex },
                { PROJECT_DESC: regex }
            ]
        };
        
        return await this.getApplyList(where, options);
    }
    
    /**
     * 获取待审批的项目申请列表
     * @param {Object} options 选项
     * @returns {Promise<Array>} 申请列表
     */
    async getPendingApprovalList(options = {}) {
        const where = {
            $or: [
                { APPLY_ACTIVE_STATUS: 12 }, // PLAN_REVIEW
                { APPLY_ACTIVE_STATUS: 22 }, // DESIGN_REVIEW
                { APPLY_ACTIVE_STATUS: 32 }, // DEV_REVIEW
                { APPLY_ACTIVE_STATUS: 51 }  // REVIEW_ONGOING
            ]
        };
        
        return await this.getApplyList(where, options);
    }
    
    /**
     * 获取休眠中的项目申请列表
     * @param {Object} options 选项
     * @returns {Promise<Array>} 申请列表
     */
    async getSleepingApplyList(options = {}) {
        const where = { IS_SLEEP: 1 };
        return await this.getApplyList(where, options);
    }
    
    /**
     * 计算各状态的项目申请数量
     * @returns {Promise<Object>} 统计结果
     */
    async countApplyByStatus() {
        const counts = {};
        
        // 规划中
        counts.planning = await this.count({ APPLY_STATUS: 10 });
        
        // 设计中
        counts.design = await this.count({ APPLY_STATUS: 20 });
        
        // 开发中
        counts.development = await this.count({ APPLY_STATUS: 30 });
        
        // 测试中
        counts.testing = await this.count({ APPLY_STATUS: 40 });
        
        // 评审中
        counts.review = await this.count({ APPLY_STATUS: 50 });
        
        // 已完成
        counts.completed = await this.count({ APPLY_STATUS: 60 });
        
        // 已取消
        counts.cancelled = await this.count({ APPLY_STATUS: 99 });
        
        // 总数
        counts.total = await this.count({});
        
        // 休眠中
        counts.sleeping = await this.count({ IS_SLEEP: 1 });
        
        // 待审批
        counts.pendingApproval = await this.count({
            $or: [
                { APPLY_ACTIVE_STATUS: 12 }, // PLAN_REVIEW
                { APPLY_ACTIVE_STATUS: 22 }, // DESIGN_REVIEW
                { APPLY_ACTIVE_STATUS: 32 }, // DEV_REVIEW
                { APPLY_ACTIVE_STATUS: 51 }  // REVIEW_ONGOING
            ]
        });
        
        return counts;
    }
}

module.exports = ProjectApplyModel; 